package com.ruoyi.quartz.task;

import java.util.Date;
import java.util.Random;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.MeterData;
import com.ruoyi.system.service.IMeterDataService;

/**
 * 电表数据采集定时任务
 * 
 * @author ruoyi
 */
@Component("meterDataTask")
public class MeterDataCollectTask
{
    @Autowired
    private IMeterDataService meterDataService;
    
    private Random random = new Random();
    
    /**
     * 模拟采集电表数据
     */
    public void collectMeterData(String deviceId)
    {
        if (StringUtils.isEmpty(deviceId))
        {
            System.out.println("设备ID不能为空");
            return;
        }
        
        MeterData meterData = new MeterData();
        meterData.setDeviceId(deviceId);
        meterData.setCollectTime(DateUtils.getNowDate());
        
        // 模拟电压数据 (V)
        meterData.setUa(220.0 + random.nextDouble() * 10 - 5); // 220V ±5V
        meterData.setUb(220.0 + random.nextDouble() * 10 - 5);
        meterData.setUc(220.0 + random.nextDouble() * 10 - 5);
        meterData.setUab(380.0 + random.nextDouble() * 15 - 7.5); // 380V ±7.5V
        meterData.setUbc(380.0 + random.nextDouble() * 15 - 7.5);
        meterData.setUca(380.0 + random.nextDouble() * 15 - 7.5);
        
        // 模拟电流数据 (A)
        meterData.setIa(5.0 + random.nextDouble() * 2);
        meterData.setIb(5.0 + random.nextDouble() * 2);
        meterData.setIc(5.0 + random.nextDouble() * 2);
        
        // 模拟功率数据
        double pt = meterData.getUa() * meterData.getIa() + 
                   meterData.getUb() * meterData.getIb() + 
                   meterData.getUc() * meterData.getIc();
        pt = pt / 1000; // 转换为kW
        meterData.setPt(pt);
        
        // 模拟无功功率 (kVar)
        meterData.setQt(pt * 0.3 * (random.nextDouble() * 0.4 + 0.8)); // 约为有功功率的30%左右
        
        // 模拟功率因数
        meterData.setPf(0.85 + random.nextDouble() * 0.1); // 0.85-0.95之间
        
        // 模拟频率 (Hz)
        meterData.setFreq(50.0 + random.nextDouble() * 0.2 - 0.1); // 50Hz ±0.1Hz
        
        // 获取上一次的电能数据，累加本次电能
        MeterData lastData = meterDataService.getLastDataByDeviceId(deviceId);
        double lastEnergy = lastData != null && lastData.getTotalActiveEnergy() != null ? 
                lastData.getTotalActiveEnergy() : 0.0;
        
        // 计算本次电能增量 (kWh) = 功率(kW) * 时间(h)
        double energyIncrement = pt * 1.0; // 假设1小时采集一次，所以时间为1小时
        meterData.setTotalActiveEnergy(lastEnergy + energyIncrement);
        
        meterData.setStatus(1); // 1-正常
        meterData.setRemark("自动采集");
        
        // 保存数据
        meterDataService.insertMeterData(meterData);
        
        System.out.println("设备[" + deviceId + "]电表数据采集成功，时间：" + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", meterData.getCollectTime()));
    }
    
    /**
     * 批量采集多个电表数据
     */
    public void collectAllMeterData()
    {
        // 这里可以从配置或数据库中获取所有需要采集的电表ID
        String[] deviceIds = {"METER001", "METER002", "METER003"};
        
        for (String deviceId : deviceIds)
        {
            collectMeterData(deviceId);
        }
        
        System.out.println("所有电表数据采集完成，时间：" + DateUtils.getTime());
    }
}